PostgreSQL 安全管理 公共权限管理
1 背景知识
假设一个用户需要读取一个模式下的所有表数据,但是这个模式下的表经常变动。导致新建的表无法读取,需要每次授权,导致DBA 工作量较多。
怎么解决这种场景问题,这就是隐式权限能够做到的功能,也是本章所要介绍的内容。
2 环境准备
\c - postgres
DROP SCHEMA schema01 CASCADE;
DROP USER user01;
DROP USER user02;
CREATE USER user01;
CREATE USER user02;
CREATE SCHEMA schema01;
GRANT ALL ON SCHEMA schema01 TO user01;
GRANT USAGE ON SCHEMA schema01 TO user02;
\c - user01
CREATE TABLE schema01.t01(id int);
INSERT INTO schema01.t01 VALUES(1);
3 在模式下新建的表自动授权
\c - postgres
ALTER DEFAULT PRIVILEGES FOR USER user01
IN SCHEMA schema01
GRANT SELECT ON TABLES TO user02;
4 使用user01 创建新表
\c - user01
CREATE TABLE schema01.t02(id int);
INSERT INTO schema01.t02 VALUES(2);
5 验证 user02 是否能够读取数据
\c - user02
SELECT * FROM schema01.t01;
SELECT * FROM schema01.t02;
Note
这里可以看到t02 已经能够成功查询,但是t01 失败。
6 将存量表赋权
\c - postgres
GRANT SELECT ON ALL TABLES IN SCHEMA schema01 TO user02;
7 其他授权方式
ALTER DEFAULT PRIVILEGES FOR USER user01,user02
IN SCHEMA S9 GRANT SELECT ON TABLES TO user03;
将 S9 的 user01 和user02 用户创建的表的查询权限赋权给user03。
8 如何查询隐式权限
SELECT relname,relacl FROM pg_class WHERE relacl::text like '%user01%';